package demo8;

import java.util.ArrayList;

public class Main {
    //通配符下限
    public static void main(String[] args) {
        //注意：存放Cat和它的父类Animal类型的集合，可以调用该函数。而Cat的子类MiniCat类型不能
        //因为showAnimal方法的实参类型是Cat。
        //且用了下限通配符，规定了Cat类为下限，所以不能用MiniCat作为参数调用该函数
        ArrayList<Animal> animals = new ArrayList<>();
        showAnimal(animals);

        ArrayList<Cat> cats = new ArrayList<>();
        showAnimal(cats);


        ArrayList<MiniCat> miniCats = new ArrayList<>();
        //showAnimal(miniCats); //报错


    }

    /**
     * 通配符下限：规定了方法传参的下限，要求只能是Cat和Cat的父类类型去调用该函数
     * @param list
     */
    public static void showAnimal(ArrayList<? super Cat> list) {
        //注意2：通配符下限方法中可以添加实参类型Cat和它的子类MiniCat类型，但不能添加实参类型Cat的父类类型Animal
        //list.add(new MiniCat());
        //list.add(new Animal());  //报错

        //注意3：通配符下限方法中集合元素是用Object处理的
        for (Object o : list) {
            System.out.println(o);
        }
    }


//    //通配符上限
//    public static void main1(String[] args) {
//        //list.add(new Animal()); //报错，Animal不是Cat或者Cat的子类，不能作为参数
//        ArrayList<Animal> animals = new ArrayList<>();
//        //showAnimal(animals);  //报错
//
//
//        //Cat本身和Cat的子类MiniCat可以传参
//        ArrayList<Cat> cats = new ArrayList<>();
//        showAnimal(cats);
//
//        ArrayList<MiniCat> miniCats = new ArrayList<>();
//        showAnimal(miniCats);
//    }
//
//    //类型通配符上限 ArrayList<? extends Cat>
//    //注意：如果这里参数不是一个类，而是普通的数据类型，那就不能用对象去调用方法
//    public static void showAnimal(ArrayList<? extends Cat> list) {
//        for (int i = 0; i < list.size(); i++) {
//            Cat cat = list.get(i);
//            System.out.println(cat);
//        }
//    }
}
